package er.extensions.formatters; import java.text.FieldPosition; import java.text.Format; import java.text.ParsePosition; import java.util.Locale; import java.util.TimeZone; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalTime; import org.joda.time.chrono.BaseChronology; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class ERXJodaLocalTimeFormatter extends Format implements ERXJodaFormat { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; private transient DateTimeFormatter formatter; private final String _pattern; private final BaseChronology _chronology; private final Locale _locale; private final DateTimeZone _zone; public ERXJodaLocalTimeFormatter(String pattern) { this(pattern, null, null, null); } public ERXJodaLocalTimeFormatter(String pattern, DateTimeZone zone) { this(pattern, null, null, zone); } public ERXJodaLocalTimeFormatter(String pattern, TimeZone zone) { this(pattern, null, null, DateTimeZone.forTimeZone(zone)); } public ERXJodaLocalTimeFormatter(String pattern, Locale locale, TimeZone zone) { this(pattern, null, locale, DateTimeZone.forTimeZone(zone)); } public ERXJodaLocalTimeFormatter(String pattern, BaseChronology chronology, Locale locale, DateTimeZone zone) { _pattern = pattern; _chronology = chronology; _locale = locale; _zone = zone; } public ERXJodaLocalTimeFormatter(Locale locale, String style) { this(DateTimeFormat.patternForStyle(style, locale)); } protected DateTimeFormatter formatter() { if(formatter == null) { formatter = DateTimeFormat.forPattern(_pattern); if(_chronology != null) { formatter = formatter.withChronology(_chronology); } if(_locale != null) { formatter = formatter.withLocale(_locale); } if(_zone != null) { formatter = formatter.withZone(_zone); } } return formatter; } @Override public StringBuffer format(Object obj, StringBuffer buffer, FieldPosition pos) { formatter().printTo(buffer, (LocalTime)obj); return buffer; } @Override public LocalTime parseObject(String str, ParsePosition pos) { DateTime dt = formatter().parseDateTime(str); pos.setIndex(str.length()); LocalTime lt = new LocalTime(dt); return lt; } public String pattern() { return _pattern; } public BaseChronology chronology() { return _chronology; } public Locale locale() { return _locale; } public DateTimeZone zone() { return _zone; } }